//============================================================================================
/**
 * @file	bong_bed.c
 * @author	NozomuSaito
 * @date	2008.06.04
 * @brief	ボングリ状態データ操作
 */
//============================================================================================

#include "common.h"

#include "bong_bed_local.h"
#include "savedata/bong_bed.h"
#include "savedata/bonguri.h"

#include "gflib/system.h"

#include "bonguri_list.dat"

#ifdef	DEBUG_ONLY_FOR_saitou
#define	DEBUG_BONG_INFO
#endif

#ifdef	DEBUG_BONG_INFO
#define	PUT_BONG_INFO(s,i)	PrintBongInfo((s),(i))
#else
#define	PUT_BONG_INFO(s,i)	/* Do Nothing */
#endif

static void InitBonguri(BONG_BED * b);
//============================================================================================
//
//
//		セーブデータインターフェイス
//
//
//============================================================================================
//----------------------------------------------------------
/**
 * @brief	ボングリ状態データサイズの取得
 * @return	int		ボングリ状態データのサイズ
 */
//----------------------------------------------------------
int BONGBED_GetWorkSize(void)
{
	return sizeof(BONG_BED) * BONG_BED_MAX;
}

//----------------------------------------------------------
/**
 * @brief	ボングリ状態データ全体の初期化
 * @param	BONG_BED		ボングリ状態データ全体へのポインタ
 */
//----------------------------------------------------------
void BONGBED_Init(BONG_BED * bbed)
{
	int i;
	MI_CpuClear8(bbed, sizeof(BONG_BED) * BONG_BED_MAX);

	for (i = 0; i < BONG_BED_MAX; i++) {
		bbed[i].Stat = BONG_STAT_NOTHING;
	}
}

//----------------------------------------------------------
/**
 * @brief	ボングリの初期状態セット
 * @param	bbed		ボングリ状態データ全体へのポインタ
 */
//----------------------------------------------------------
void BONGBED_SetDefaultData(BONG_BED * bbed)
{
	int i;
	int max;

	max = NELEMS(BonguriList);
	for (i = 0; i < BONG_BED_MAX || i < max; i++) {
		InitBonguri(&bbed[i]);
		bbed[i].Stat = BONG_STAT_FRUIT;
		bbed[i].GrowthFlag = TRUE;
	}
}

//============================================================================================
//
//		内部ツール関数
//
//============================================================================================
#ifdef	DEBUG_BONG_INFO
//----------------------------------------------------------
/**
 * @brief	デバッグ情報の表示
 * @param	bed
 * @param	i
 */
//----------------------------------------------------------
static void PrintBongInfo(const BONG_BED * bed, int i)
{
	const BONG_BED * b = bed + i;
	OS_Printf("BONG (ID:%03d) FLAG:%d STAT:%d\n",
			i, b->GrowthFlag, b->Stat);
	if (b->Stat == BONG_STAT_NOTHING) {
		return;
	}
}
#endif

//----------------------------------------------------------
/**
 * @brief	ボングリデータ初期化
 * @param	b	ボングリ状態データへのポインタ
 */
//----------------------------------------------------------
static void InitBonguri(BONG_BED * b)
{
	b->Stat = BONG_STAT_NOTHING;
	b->GrowthFlag = FALSE;
}

//============================================================================================
//
//
//		ボングリ状態アクセス用外部公開関数
//
//
//============================================================================================

//----------------------------------------------------------
/**
 * @brief	ボングリの状態取得
 * @param	bbed		ボングリ状態データ全体へのポインタ
 * @param	inID		ボングリを指定するID
 * @return	BONG_STAT	ボングリの状態（bong_bed.hの定義を参照）
 */
//----------------------------------------------------------
BONG_STAT BONGBED_GetBongStatus(const BONG_BED * bbed, const int inID)
{
	return bbed[inID].Stat;
}
//----------------------------------------------------------
/**
 * @brief	ボングリの種類を取得
 * @param	bbed		ボングリ状態データへのポインタ
 * @param	inID		ボングリを指定するID
 * @return	int			ボングリの種類
 */
//----------------------------------------------------------
int BONGBED_GetBongType(const BONG_BED * bbed, const int inID)
{
	return BonguriList[inID];
}

//----------------------------------------------------------
/**
 * @brief	ボングリタイプからカラーナンバーに変更
 * @param	bbed		ボングリ状態データ全体へのポインタ
 * @param	inID		ボングリを指定するID
 *
 * @return	int			ボングリのカラーID
 */
//----------------------------------------------------------
BONG_COLOR BONGBED_GetBongColor(const BONG_BED * bbed, const int inID)
{
	int bong_id;
#if 0
	//無効コード、青、黒、緑、赤、白、ピンク、黄色
	static const u8 type2col[] = {
	 0,BONG_COL_BLUE, BONG_COL_BLACK,BONG_COL_GREEN,BONG_COL_RED,BONG_COL_WHITE,
	 BONG_COL_PINK,BONG_COL_YELLOW
	};
	return type2col[BonguriList[inID]];
#endif
	bong_id = BonguriList[inID];
	if (bong_id <= 0){
		GF_ASSERT(0);
		return 0;
	}
	return bong_id-1;
}



//----------------------------------------------------------
/**
 * @brief	成長フラグの取得
 * @param	bbed		ボングリ状態データ全体へのポインタ
 * @param	inID		ボングリを指定するID
 * @return	BOOL		TRUEのとき、成長する
 */
//----------------------------------------------------------
BOOL BONGBED_GetGrowthFlag(const BONG_BED * bbed, const  int inID)
{
	return bbed[inID].GrowthFlag;
}

//----------------------------------------------------------
/**
 * @brief	成長フラグのセット
 * @param	bbed		ボングリ状態データ全体へのポインタ
 * @param	inID		ボングリを指定するID
 * @param	inFlg		TRUEのとき、成長する
 */
//----------------------------------------------------------
void BONGBED_SetGrowthFlag(BONG_BED * bbed, const int inID, const BOOL inFlg)
{
#ifdef	DEBUG_ONLY_FOR_saitou
	OS_Printf("BONG:%d %s\n",inID, (inFlg?"ON":"OFF"));
#endif
	bbed[inID].GrowthFlag = inFlg;
}

//----------------------------------------------------------
/**
 * @brief	ボングリを収穫
 * @param	bbed		ボングリ状態データ全体へのポインタ
 * @param	inID		ボングリを指定するID
 */
//----------------------------------------------------------
void BONGBED_GetHarvest(BONG_BED * bbed, const int inID)
{
	PUT_BONG_INFO(bbed,inID);
	InitBonguri(&bbed[inID]);
}

//----------------------------------------------------------
/**
 * @brief	ボングリを成長させる
 * @param	bbed	ボングリ状態データ全体へのポインタ
 */
//----------------------------------------------------------
void BONGBED_Growth(BONG_BED * bbed)
{
	int i;
	for (i=0;i<BONG_BED_MAX;i++) {
		BONG_BED * b;
		b = &bbed[i];

		if (b->Stat == BONG_STAT_NOTHING){
			b->Stat = BONG_STAT_FRUIT;
			b->GrowthFlag = TRUE;
		}
	}
}